home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP12 / TOOLBAR.C < prev    next >
C/C++ Source or Header  |  1995-12-31  |  12KB  |  386 lines

  1. /*----------------------------------------
  2.    TOOLBAR.C -- Toolbar helper functions.
  3.                 (c) Paul Yao, 1996
  4.   ----------------------------------------*/
  5. #include <windows.h>
  6. #include <commctrl.h>
  7. #include "comcthlp.h"
  8. #include "gadgets.h"
  9. #include "notifdef.h"
  10.  
  11. HWND hwndCombo ;
  12. HWND hwndEdit ;
  13. HWND hwndToolTip ;
  14. HWND hwndTB ;
  15.  
  16. int cyToolBar ;
  17.  
  18. BOOL bComboBox   = FALSE ;
  19. BOOL bStrings    = FALSE ;
  20. BOOL bLargeIcons = FALSE ;
  21.  
  22. DWORD dwToolBarStyles = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
  23.                         CCS_TOP | CCS_NODIVIDER | TBSTYLE_TOOLTIPS ;
  24.  
  25. extern HINSTANCE hInst ;
  26.  
  27. char szTbStrings[] = "New\0Open\0Save\0Print\0Preview\0"
  28.                      "Cut\0Copy\0Paste\0Undo\0Properties\0"
  29.                      "Help\0Delete\0" ;
  30.  
  31. TBBUTTON tbb[] = 
  32.      {
  33.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  34.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  35.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  36.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  37.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  38.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  39.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  40.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  41.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  42.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  43.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  44.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  45.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  46.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  47.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  48.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  49.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  50.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  51.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  52.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  53.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  54.      STD_FILENEW, IDM_FILE_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON,
  55.         0, 0, 0, 0,
  56.      STD_FILEOPEN, IDM_FILE_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON,
  57.         0, 0, 0, 1,
  58.      STD_FILESAVE, IDM_FILE_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON,
  59.         0, 0, 0, 2,
  60.      STD_PRINT, IDM_FILE_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON,
  61.         0, 0, 0, 3,
  62.      STD_PRINTPRE, IDM_FILE_PREVIEW, TBSTATE_ENABLED, TBSTYLE_CHECK,
  63.         0, 0, 0, 4,
  64.  
  65.      0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, 0,
  66.  
  67.      STD_CUT, IDM_EDIT_CUT, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP,
  68.         0, 0, 0, 5,
  69.      STD_COPY, IDM_EDIT_COPY, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP,
  70.         0, 0, 0, 6,
  71.      STD_PASTE, IDM_EDIT_PASTE, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 
  72.         0, 0, 0, 7,
  73.      STD_UNDO, IDM_EDIT_UNDO, TBSTATE_ENABLED, TBSTYLE_BUTTON,
  74.         0, 0, 0, 8,
  75.      STD_PROPERTIES, IDM_EDIT_PROP, TBSTATE_ENABLED, TBSTYLE_CHECK,
  76.         0, 0, 0, 9,
  77.      STD_HELP, IDM_TB_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON,
  78.         0, 0, 0, 10,
  79.      STD_DELETE, IDM_TB_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON,
  80.         0, 0, 0, 11,
  81.      } ;
  82.  
  83. int nCust[] = { 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, -1} ;
  84.  
  85. TBADDBITMAP tbStdLarge[] = 
  86.      {
  87.      HINST_COMMCTRL, IDB_STD_LARGE_COLOR,
  88.      } ;
  89.  
  90. TBADDBITMAP tbStdSmall[] = 
  91.      {
  92.      HINST_COMMCTRL, IDB_STD_SMALL_COLOR,
  93.      } ;
  94.  
  95. //-------------------------------------------------------------------
  96. LPSTR GetString (int iString)
  97.      {
  98.      int i, cb ;
  99.      LPSTR pString ;
  100.  
  101.      // Cycle through to requested string
  102.      pString = szTbStrings ;
  103.      for (i = 0 ; i < iString ; i++)
  104.           {
  105.           cb = lstrlen (pString) ;
  106.           pString += (cb + 1) ;
  107.           }
  108.  
  109.      return pString ;
  110.      }
  111.  
  112. //-------------------------------------------------------------------
  113. LRESULT ToolBarNotify (HWND hwnd, WPARAM wParam, LPARAM lParam)
  114.      {
  115.      LPNMHDR pnmh = (LPNMHDR) lParam ;
  116.      int idCtrl = (int) wParam ;
  117.  
  118.      // Allow toolbar to be customized
  119.      if ((pnmh->code == TBN_QUERYDELETE) ||
  120.          (pnmh->code == TBN_QUERYINSERT))
  121.           {
  122.           return 1 ; // We always say "yes"
  123.           }
  124.  
  125.      // Provide details of allowable toolbar buttons
  126.      if (pnmh->code == TBN_GETBUTTONINFO)
  127.           {
  128.           LPTBNOTIFY ptbn = (LPTBNOTIFY) lParam ;
  129.           int iButton = nCust[ptbn->iItem] ;
  130.  
  131.           if (iButton != -1)
  132.                {
  133.                lstrcpy (ptbn->pszText, GetString (ptbn->iItem)) ;
  134.                memcpy (&ptbn->tbButton, &tbb[iButton], sizeof (TBBUTTON)) ;
  135.                return 1 ;
  136.                }
  137.           }
  138.  
  139.      return 0 ;
  140.      }
  141.  
  142. //-------------------------------------------------------------------
  143. HWND InitToolBar (HWND hwndParent)
  144.      {
  145.      int  iNumButtons ;
  146.      LPTBBUTTON ptbb ;
  147.  
  148.      if (bComboBox)
  149.           {
  150.           ptbb = &tbb[0] ;
  151.           iNumButtons = 31 ;
  152.           }
  153.      else
  154.           {
  155.           ptbb = &tbb[21] ;
  156.           iNumButtons = 10 ;
  157.           }
  158.  
  159.      UINT uiBitmap = (bLargeIcons) ? IDB_STD_LARGE_COLOR :
  160.                                      IDB_STD_SMALL_COLOR ;
  161.      hwndTB = CreateToolbarEx (hwndParent,
  162.                    dwToolBarStyles,
  163.                    1, 15,
  164.                    HINST_COMMCTRL,
  165.                    uiBitmap,
  166.                    ptbb,
  167.                    iNumButtons,
  168.                    0, 0, 0, 0,
  169.                    sizeof (TBBUTTON)) ;
  170.  
  171.      // If requested, add to string list
  172.      if (bStrings)
  173.           ToolBar_AddString (hwndTB, 0, szTbStrings) ;
  174.  
  175.      // Store handle to tooltip control
  176.      hwndToolTip = ToolBar_GetToolTips (hwndTB) ;
  177.  
  178.      // Insert combo box into toolbar
  179.      if (bComboBox)
  180.           {
  181.           RECT r ;
  182.           int x, y, cx, cy ;
  183.  
  184.           // Calculate coordinates for combo box
  185.           ToolBar_GetItemRect (hwndTB, 0, &r) ;
  186.           x = r.left ;
  187.           y = r.top ;
  188.           cy = 100 ;
  189.           ToolBar_GetItemRect (hwndTB, 18, &r) ;
  190.           cx = r.right - x + 1 ;
  191.  
  192.           hwndCombo = CreateWindow ("combobox",
  193.                            NULL,
  194.                            WS_CHILD | WS_VISIBLE |
  195.                            CBS_DROPDOWN,
  196.                            x, y, cx, cy,
  197.                            hwndParent,
  198.                            (HMENU) IDC_TB_COMBOBOX,
  199.                            hInst,
  200.                            0) ;
  201.  
  202.           // Set toolbar as combo box window parent
  203.           SetParent (hwndCombo, hwndTB) ;
  204.  
  205.           SendMessage (hwndCombo, CB_ADDSTRING, 0, (LPARAM) "One") ;
  206.           SendMessage (hwndCombo, CB_ADDSTRING, 0, (LPARAM) "Two") ;
  207.           SendMessage (hwndCombo, CB_ADDSTRING, 0, (LPARAM) "Three") ;
  208.  
  209.           // Calculate toolbar height
  210.           GetWindowRect (hwndCombo, &r) ;
  211.           cyToolBar = r.bottom - r.top + 1 ;
  212.           cyToolBar += y ;
  213.           cyToolBar += (2 * GetSystemMetrics (SM_CYBORDER)) ;
  214.           ToolBar_GetItemRect (hwndTB, 0, &r) ;
  215.           cyToolBar = max (cyToolBar, r.bottom+5) ;
  216.  
  217.           // If toolbar has tooltips, initialize.
  218.           if (dwToolBarStyles & TBSTYLE_TOOLTIPS)
  219.                InitToolTip (hwndTB, hwndCombo) ;
  220.           }
  221.  
  222.      return hwndTB ;
  223.      }
  224.  
  225. //-------------------------------------------------------------------
  226. void static FlipStyleFlag (LPDWORD dwStyle, DWORD flag)
  227.      {
  228.      if (*dwStyle & flag)  // Flag on -- turn off
  229.           {
  230.           *dwStyle &= (~flag) ;
  231.           }
  232.      else                  // Flag off -- turn on
  233.           {
  234.           *dwStyle |= flag ;
  235.           }
  236.      }
  237.  
  238. //-------------------------------------------------------------------
  239. HWND RebuildToolBar (HWND hwndParent, WORD wFlag)
  240.      {
  241.      HWND hwndTB ;
  242.      RECT r ;
  243.  
  244.      switch (wFlag)
  245.           {
  246.           case IDM_STRINGS :
  247.                bStrings = !bStrings ;
  248.                break ;
  249.  
  250.           case IDM_LARGEICONS :
  251.                bLargeIcons = TRUE ;
  252.                break ;
  253.  
  254.           case IDM_SMALLICONS :
  255.                bLargeIcons = FALSE ;
  256.                break ;
  257.  
  258.           case IDM_NODIVIDER :
  259.                FlipStyleFlag (&dwToolBarStyles, CCS_NODIVIDER) ;
  260.                break ;
  261.  
  262.           case IDM_WRAPABLE :
  263.                FlipStyleFlag (&dwToolBarStyles, TBSTYLE_WRAPABLE) ;
  264.                break ;
  265.  
  266.           case IDM_TOP :
  267.                dwToolBarStyles &= 0xFFFFFFFC ;
  268.                dwToolBarStyles |= CCS_TOP ;
  269.                break ;
  270.  
  271.           case IDM_BOTTOM :
  272.                dwToolBarStyles &= 0xFFFFFFFC ;
  273.                dwToolBarStyles |= CCS_BOTTOM ;
  274.                break ;
  275.  
  276.           case IDM_NOMOVEY :
  277.                dwToolBarStyles &= 0xFFFFFFFC ;
  278.                dwToolBarStyles |= CCS_NOMOVEY ;
  279.                break ;
  280.  
  281.           case IDM_NOPARENTALIGN :
  282.                FlipStyleFlag (&dwToolBarStyles, CCS_NOPARENTALIGN) ;
  283.                break ;
  284.  
  285.           case IDM_NORESIZE :
  286.                FlipStyleFlag (&dwToolBarStyles, CCS_NORESIZE) ;
  287.                break ;
  288.  
  289.           case IDM_ADJUSTABLE :
  290.                FlipStyleFlag (&dwToolBarStyles, CCS_ADJUSTABLE) ;
  291.                break ;
  292.  
  293.           case IDM_ALTDRAG :
  294.                FlipStyleFlag (&dwToolBarStyles, TBSTYLE_ALTDRAG) ;
  295.                break ;
  296.  
  297.           case IDM_TOOLTIPS :
  298.                FlipStyleFlag (&dwToolBarStyles, TBSTYLE_TOOLTIPS) ;
  299.                break ;
  300.  
  301.           case IDM_COMBOBOX :
  302.                bComboBox = (!bComboBox) ;
  303.           }
  304.  
  305.      hwndTB = InitToolBar (hwndParent) ;
  306.  
  307.      // Post parent a WM_SIZE message to resize children
  308.      GetClientRect (hwndParent, &r) ;
  309.      PostMessage (hwndParent, WM_SIZE, 0, 
  310.                   MAKELPARAM (r.right, r.bottom)) ;
  311.  
  312.      return hwndTB ;
  313.      }
  314.  
  315.  
  316. //-------------------------------------------------------------------
  317. void ToolBarMessage (HWND hwndTB, WORD wMsg)
  318.      {
  319.      switch (wMsg)
  320.           {
  321.           case IDM_TB_CHECK :
  322.                {
  323.                int nState = ToolBar_GetState (hwndTB, 1) ;
  324.                BOOL bCheck = (!(nState & TBSTATE_CHECKED)) ;
  325.                ToolBar_CheckButton (hwndTB, 1, bCheck ) ;
  326.                break ;
  327.                }
  328.  
  329.           case IDM_TB_ENABLE :
  330.                {
  331.                int nState = ToolBar_GetState (hwndTB, 2) ;
  332.                BOOL bEnabled = (!(nState & TBSTATE_ENABLED)) ;
  333.                ToolBar_EnableButton (hwndTB, 2, bEnabled) ;
  334.                break ;
  335.                }
  336.  
  337.           case IDM_TB_HIDE :
  338.                {
  339.                int nState = ToolBar_GetState (hwndTB, 3) ;
  340.                BOOL bShow = (!(nState & TBSTATE_HIDDEN)) ;
  341.                ToolBar_HideButton (hwndTB, 3, bShow) ;
  342.                break ;
  343.                }
  344.  
  345.           case IDM_TB_INDETERMINATE :
  346.                {
  347.                int nState = ToolBar_GetState (hwndTB, 4) ;
  348.                BOOL bInd = (!(nState & TBSTATE_INDETERMINATE)) ;
  349.                ToolBar_Indeterminate (hwndTB, 4, bInd) ;
  350.                break ;
  351.                }
  352.  
  353.           case IDM_TB_PRESS :
  354.                {
  355.                int nState = ToolBar_GetState (hwndTB, 5) ;
  356.                BOOL bPress = (!(nState & TBSTATE_PRESSED)) ;
  357.                ToolBar_PressButton (hwndTB, 5, bPress) ;
  358.                break ;
  359.                }
  360.  
  361.           case IDM_TB_BUTTONCOUNT :
  362.                {
  363.                int nButtons = ToolBar_ButtonCount (hwndTB) ;
  364.                char ach[80] ;
  365.                wsprintf (ach, "Button Count = %d", nButtons) ;
  366.                MessageBox (GetParent (hwndTB), ach, 
  367.                            "TB_BUTTONCOUNT", MB_OK) ;
  368.                break ;
  369.                }
  370.  
  371.           case IDM_TB_GETROWS :
  372.                {
  373.                int nRows = ToolBar_GetRows (hwndTB) ;
  374.                char ach[80] ;
  375.                wsprintf (ach, "Row Count = %d", nRows) ;
  376.                MessageBox (GetParent (hwndTB), ach, 
  377.                            "TB_GETROWS", MB_OK) ;
  378.                break ;
  379.                }
  380.           case IDM_TB_CUSTOMIZE :
  381.                // ToolBar_Customize (hwndTB) ;
  382.                SendMessage (hwndTB, TB_CUSTOMIZE, (LPARAM) &tbb[25], 5) ;
  383.                break ;
  384.           }
  385.      }
  386.